package main

import (
	"encoding/json"
	"fmt"
)

type Point struct {
	X int `json:"x"`
	Y int `json:"y"`
}

type Point1 Point

type Point2 struct {
	X int
	Y int
}

type Point3 struct {
	X float64
	Y float64
}

type Line struct {
	StartPoint Point `json:"startPoint"`
	EndPoint   Point `json:"endPoint"`
}

func main() {
	//structAddress()
	//structTypeConversion()
	struct2Json()
}

func structAddress() {
	// 结构体内的属性地址是连续的
	var p1 Point = Point{1, 2}
	fmt.Printf("p1 的地址是%p， x的地址是%p，y的地址是%p\n", &p1, &p1.X, &p1.Y)

	var l1 Line = Line{Point{1, 2}, Point{3, 4}}
	fmt.Printf("l1 的地址是%p， startPoint的地址是%p，endPoint的地址是%p\n", &l1, &l1.StartPoint, &l1.EndPoint)
}

func structTypeConversion() {
	var a Point
	var a1 Point1
	var b Point2
	var c Point3
	// a = b 这样是错的，因为格式部不一致
	a = Point(b)
	// a = Point(c) 这样也是错的，因为结构体属性类型不一致
	// 名字、个数、类型有一个不一样就无法强转
	// a = a1 这样是错的，因为格式部不一致
	a = Point(a1)
	fmt.Println(a, a1, b, c)
}

func struct2Json() {
	var line1 Line = Line{Point{1, 2}, Point{2, 3}}
	var jsonLine1, err = json.Marshal(line1)
	if err == nil {
		fmt.Println(string(jsonLine1))
	} else {
		fmt.Println(err)
	}
}
